文件系统 - 文件

一切皆文件

UNIX 系统中除进程之外的一切皆是文件,而 Linux 保持了这一特性。为
了便于文件的管理,Linux 还引入了目录(有时亦被称为文件夹)这一概念。

Linux 系统的顶层目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/              根目录
├── bin 存放用户二进制文件
├── boot 存放内核引导配置文件
├── dev 存放设备文件
├── etc 存放系统配置文件
├── home 用户主目录
├── lib 动态共享库
├── lost+found 文件系统恢复时的恢复文件
├── media 可卸载存储介质挂载点
├── mnt 文件系统临时挂载点
├── opt 附加的应用程序包
├── proc 系统内存的映射目录,提供内核与进程信息
├── root root 用户主目录
├── sbin 存放系统二进制文件
├── srv 存放服务相关数据
├── sys sys 虚拟文件系统挂载点
├── tmp 存放临时文件
├── usr 存放用户应用程序
└── var 存放邮件、系统日志等变化文件

Linux 与其他类 UNIX 系统一样并不区分文件与目录:目录是记录了其他文件名的文件。使用命令 mkdir 创建目录时,若期望创建的目录的名称与现有的文件名(或目录名)重复,则会创建失败。

元数据 VS 用户数据

我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元
数据 (metadata)。

  • 用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;
  • 元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。
    元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点
    号)才是文件的唯一标识而非文件名。

通过文件名打开文件

通过文件名打开文件

软链接 VS 硬链接

为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)

链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名(见 图 2.hard link 就是 file 的一个别名,他们有共同的 inode)。硬链接可由命令 link 或 ln 创建。如下是对文件 oldfile 创建硬链接。

软链接的访问

由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:

  1. 文件有相同的 inode 及 data block;
  2. 只能对已存在的文件进行创建;
  3. 不能交叉文件系统进行硬链接的创建;
  4. 删除一个硬链接文件并不影响其他有相同 inode 号的文件。(删除的只是filename)
  5. 不能对目录进行创建,只可对文件创建;

逐个详解

1.

2.

3.

  1. 硬链接不能对目录进行创建,只可对文件创建;

目录是树形结构。ls -a能看到目录底下有. 和.. 指向本目录和父目录,如果对父目录建立软连接就有可能会成环,破坏树形结构

5.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ echo sss > oldfile
$ link oldfile newfile # 2. oldfile要存在,newfile必须不存在,
$ ls -li
6277186 -rw-r--r-- 2 xusong staff 4 Jul 24 20:54 newfile
6277186 -rw-r--r-- 2 xusong staff 4 Jul 24 20:54 oldfile

# 5. 删除一个硬链接文件并不影响其他有相同 inode 号的文件。(删除的只是filename)
$ rm oldfile
$ ls -li
6277186 -rw-r--r-- 1 xusong staff 4 Jul 24 20:54 newfile

# 5. 不能对目录进行创建,只可对文件创建;
# 目录是树形结构。ls -a能看到目录底下有. 和.. 指向本目录和父目录,如果对父目录建立软连接就有可能会成环,破坏树形结构
$ mkdir old_dir
$ ls -lia
6277575 drwxr-xr-x 3 xusong staff 96 Jul 24 21:04 .
6277177 drwxr-xr-x 6 xusong staff 192 Jul 24 21:04 ..
6277580 drwxr-xr-x 2 xusong staff 64 Jul 24 21:04 old_dir
$ link old_dir new_dir
link: old_dir: Is a directory

FAQ

思考
软链接,是链接的node号还是路径名?
路径名。在git中看到的是路径名。另外,被link的目录删除再新建一个一样的,照样能识别。

1
2
3
4
5
6
# bash1

cd a/b/c

# bash2
mv test test

#